package cn.janyd.action.template;

import lombok.Builder;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 生成DataObject元数据
 *
 * @author janyd
 * @since 2020/8/7 18:45
 */
@Data
@Builder
public class DataObjectClass implements CodeTemplate {

    /**
     * 作者
     */
    private String author;

    /**
     * 生成日期
     */
    private String date;

    /**
     * 是否开启Lombok模式
     */
    private boolean enableLombok;

    /**
     * 是否开启链式
     */
    private boolean lombokAccessors;

    /**
     * 是否开启swagger注解
     */
    private boolean swagger;

    /**
     * 是否添加mybatisPlus注解
     */
    private boolean mybatisPlus;

    /**
     * 模板内容
     */
    private String templatePath;

    /**
     * 存放DataObject包名
     */
    private String packageName;

    /**
     * 不加后缀名称
     */
    private String objectName;

    /**
     * 生成类名
     */
    private String className;

    /**
     * 父类
     */
    private String superClassName;

    /**
     * 类注释
     */
    private String comment;

    /**
     * 表名
     */
    private String tableName;

    /**
     * 导入包
     */
    private List<String> importPackages;

    /**
     * 公共字段
     */
    private List<Field> commonFields;

    /**
     * 字段
     */
    private List<Field> fields;

    /**
     * 获取模板
     *
     * @return 模板
     */
    @Override
    public String getTemplatePath() {
        return templatePath;
    }

    /**
     * 获取模板填充的数据
     *
     * @return 数据
     */
    @Override
    public Map<String, Object> getObjectMap() {
        Map<String, Object> objectMap = new HashMap<>(1);
        objectMap.put("dataObject", this);
        return objectMap;
    }


    @Data
    @Accessors(chain = true)
    public static class Field {

        /**
         * 是否是主键
         */
        private boolean pk = false;

        /**
         * 数据库字段名
         */
        private String columnName;

        /**
         * 字段类型
         */
        private String type;

        /**
         * 字段名称
         */
        private String name;

        /**
         * 首字母大写的驼峰写法
         */
        private String capitalName;

        /**
         * 权限修饰符
         */
        private String modifier;


        /**
         * 注释
         */
        private String comment;
    }
}
